<?php
/**
 * DooCacheSession class file.
 *
 * @author Zohaib Sibt-e-Hassan <zohaib.hassan@gmail.com>
 * @link http://www.doophp.com/
 * @copyright Copyright &copy; 2009 Zohaib Sibt-e-Hassan
 * @license http://www.doophp.com/license
 */

/**
 * DooCacheSession, manage session inside cache system instead of
 * default php session system, extremely useful when we need extreme
 * performance and combined with memcache
 * Create your required cache system, pass the cache object to the DooCacheSession::installOnCache, example:
 * <code>
 * $cache = Doo::cache('memcache');
 * DooCacheSession::insallOnCache($cache, 'myPrefixForSessionID');
 * $session = Doo::session("mysite");
 * </code>
 * After that use session variables normally and transparently ;)
 * Add something to session
 * <code>$session->someVariable = "something";</code>
 * Get that variable
 * <code>
 * $var = $session=>get("someVariable"); (returns "something")
 * </code>
 *
 * @author Zohaib Sibt-e-Hassan <zohaib.hassan@gmail.com>
 * @copyright &copy; 2009 Zohaib Sibt-e-Hassan
 * @license http://www.doophp.com/license
 * @package doo.session
 * @since 1.3
 */

class DooCacheSession
{
	/**
	 * Session lifetime
	 */
	protected static $lifetime = 0;

	/**
	 * Session ID prefix
	 */
	protected static $sessionPrefix = 'DooCS';

	/**
	 * Cache object
	 */
	protected static $cache = null;

	/**
	 * Open session system
	 *
	 * @return boolean true
	 */
	public static function open()
	{
		return true;
	}

	/**
	 * Read session data against given $id
	 *
	 * @return mixed false if id was not found in session system; string data otherwise
	 */
	public static function read($id)
	{
		$pfx = self::$sessionPrefix;
		return self::$cache->get("{$pfx}{$id}");
	}

	/**
	 * Write given session $data again given session $id
	 *
	 * @return boolean true if value was session was written successfully
	 */
	public static function write($id, $data)
	{
		$pfx = self::$sessionPrefix;
		return self::$cache->set("{$pfx}{$id}", $data, self::$lifetime);
	}

	/**
	 * Destroy given session $id from cache
	 *
	 * @return boolean true if key was deleted, otherwise false
	 */
	public static function destroy($id)
	{
		$pfx = self::$sessionPrefix;
		return self::$cache->flush("{$pfx}{$id}");
	}

	/**
	 * Garbage collect always returns true; since cache systems automatically expire out keys
	 *
	 * @return boolean true
	 */
	public static function gc(){ return true; }

	/**
	 * Close session system
	 *
	 * @return boolean true
	 */
	public static function close(){ return true; }

	/**
	 * Install session managment on given $cacheSystem, with given $prefix
	 *
	 * @return boolean status of installtaion
	 */
	public static function installOnCache(&$cacheSystem, $prefix=null){
		ini_set('session.save_handler', 'user');
		self::$lifetime = ini_get('session.gc_maxlifetime');

		self::$cache = $cacheSystem;
		if(is_string($prefix))
		self::$sessionPrefix = $prefix;
			
		return session_set_save_handler(
		array(__CLASS__,"open"),
		array(__CLASS__,"close"),
		array(__CLASS__,"read"),
		array(__CLASS__,"write"),
		array(__CLASS__,"destroy"),
		array(__CLASS__,"gc")
		);
	}
}
